对象所有权
到目前为止,您已经探索了对象的所有基础知识以及如何使用它们。我们为您保持动力而感到自豪。现在,在本课程中,我们将探索不同的对象所有权方法,这将帮助您定义对象的安全性。
对象所有权
对象所有权定义了在进行交易时如何使用对象。对象所有权有多种类型。这是这些。
- 地址拥有
- 动态字段
- 不可变的
- 共享
- 嵌套
让我们一一详细探讨它们。
地址拥有
地址拥有的对象是由32字节地址拥有的对象,可以是帐户地址或对象ID。所有者是唯一有权访问它的人。您可以通过以下两种方式创建地址拥有的对象。
#![allow(unused)] fn main() { sui::transfer::transfer(obj: T, recipient: address) sui::transfer::public_transfer(obj: T, recipient: address) }
- 如果您要为对象定义自定义传输策略,请使用
sui::transfer::transfer
函数,这意味着它仅具有key
能力,没有store
能力。 - 如果对象具有
store
能力,则使用sui::transfer::public_transfer
创建地址拥有的函数。
当您只想拥有该对象的一个所有者时,可以使用地址拥有的对象。
不可变对象
不可变对象是不可变的,这意味着它没有所有者,不能转让给任何人,也不能删除。以下是如何使对象不可变。
#![allow(unused)] fn main() { public native fun public_freeze_object(obj: T) }
对象成为不可变对象后,就无法使其可变。但是,您可以使用对 entry
函数的不可变引用将其作为只读对象作为参数传递给函数。
共享对象
共享对象是每个人都可以访问的对象。与地址拥有的对象相比,共享对象可以被网络上的任何人访问。以下是创建共享对象的方法。
#![allow(unused)] fn main() { transfer::share_object(obj: T) }
嵌套
与许多编程语言一样,您可以在另一个 struct
内部使用 struct
类型实例。以下是您可以如何做到这一点。
#![allow(unused)] fn main() { struct Foo has key { id: UID, bar: Bar, } struct Bar has store { value: u64, } }
这里,具有 key
能力的 Foo
Sui 对象有一个具有 Bar
数据类型的实例 bar
,它是一个 struct
。这里, Bar
不是Sui对象,因为它没有 key
能力。您可以将其设为 Sui 对象并在 Foo
中使用它。
我们将在接下来的课程中了解有关对象包装的更多信息。
动态对象字段
有多种方法可以使用对象字段来存储不同类型的数据。但它有几个缺点:
- 发布模块时,对象具有一组固定的字段,由
struct
声明中的键标识。 - 一个对象包裹多个其他对象可能会增加 Gas 费,并且有大小限制。
- 使用 Move
vector
类型不可能存储不同类型的对象集合,因为它需要单一类型<T>
。
这就是动态字段发挥作用的地方。
总结
我们为您详细了解这些物体而感到自豪。接下来,我们将详细解释“Hello World”程序,然后我们将评估如何在 Move on Sui 上编写您自己的智能合约